/////////////////////////////////////////////////////////////////////////////
// This file is part of the "Java-DAP" project, a Java implementation
// of the OPeNDAP Data Access Protocol.
//
// Copyright (c) 2007 OPeNDAP, Inc.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//
// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
/////////////////////////////////////////////////////////////////////////////
using System;
using NDODS.DAP.BaseTypes;
using NDODS.DAP.Exceptions;

namespace NDODS.DAP.Server
{
	
	/// <summary> Represents a sub-clause that is a URL reference to remote data.
	/// This feature is not yet supported in Java. Thus this class
	/// throws an exception in its constructor.
	/// 
	/// </summary>
	/// <author>  joew
	/// </author>
	/// <seealso cref="ClauseFactory">
	/// </seealso>
	public class DereferenceClause:AbstractClause, ISubClause
	{
		virtual public BaseType Value
		{
			get
			{
				return value_Renamed;
			}
			
		}
		virtual public IClause Parent
		{
			get
			{
				return parent;
			}
			
			set
			{
				this.parent = value;
			}
			
		}
		virtual public System.String URL
		{
			get
			{
				return url;
			}
			
		}
		
		/// <summary> Creates a new DereferenceClause</summary>
		protected internal DereferenceClause(System.String url)
		{
			this.url = url;
			this.constant = true;
			this.defined = true;
			this.value_Renamed = retrieve(url);
			this.children = new System.Collections.ArrayList();
		}
		
		public virtual BaseType Evaluate()
		{
			return value_Renamed;
		}
		
		protected internal virtual BaseType retrieve(System.String url)
		{
			
			throw new DAP2ServerSideException(DAP2Exception.UNKNOWN_ERROR, "dereferencing not supported");
		}
		
		public override System.String ToString()
		{
			return "*\"" + url + "\"";
		}
		
		protected internal System.String url;
		protected internal IClause parent;
		protected internal BaseType value_Renamed;
	}
}